// run: $exec < input
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <utility>
#include <map>
#include <cmath>

std::vector<std::pair<int, int>> da;

int const maxn = 1000;
int num[maxn];

long long gcd(long long x, long long y)
{
	return (!y) ? x : gcd(y, x % y);
}

void reduce(int c, int t)
{
	for (int i = 0; i < (int)da.size(); i++)
		if (da[i].first == c) {
			da[i].second -= t;
			return;
		}
}

int main()
{
	int n;
	std::cin >> n;
	std::map<int, int> count;
	for (int i = 0, x; i < n * n; i++) {
		std::cin >> x;
		count[x]++;
	}
	for (auto i : count) {
		da.push_back(i);
	}

	std::sort(da.begin(), da.end(), std::greater<std::pair<int, int>>());

	/*
	for (auto i : da)
		std::cout << i.first << ' ' << i.second << '\n';
	std::cout << "------------------\n";
	*/

	for (int i = 0; i < (int)da.size(); i++) {
		auto t = da[i];
		int tmp = 0;
		for (int j = 0; j < i; j++)
			if (!(da[j].first % t.first)) tmp += num[j];
		num[i] = std::round(std::sqrt(t.second + tmp * tmp)) - tmp;
		if (num[i]) {
			for (int j = 0; j < i; j++)
				if (num[j])
					reduce(gcd(t.first, da[j].first), 2 * num[j] * num[i]);
		}
	}

	/*
	std::cout << "------------------num\n";
	for (int i = 0; i < (int)da.size(); i++)
		std::cout << da[i].first << ' ' << num[i] << '\n';
	std::cout << "------------------num\n";
	*/

	int tot = 0;
	for (int i = 0; i < (int)da.size(); i++)
		if (num[i])
			for (int j = 0; j < num[i] && tot < n; j++, tot++)
				std::cout << da[i].first << ' ';
	std::cout << '\n';
}

